#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
配置工具 - 帮助用户配置网站收集规则
"""

import os
import sys
import yaml
from pathlib import Path
from colorama import init, Fore, Style

# 初始化colorama
init(autoreset=True)

class ConfigTool:
    """配置工具"""
    
    def __init__(self):
        self.config_dir = Path("config")
        self.sites_config_file = self.config_dir / "sites.yaml"
        self.system_config_file = self.config_dir / "system.yaml"
        
    def show_menu(self):
        """显示主菜单"""
        print(f"{Fore.CYAN}=== 网站内容收集器配置工具 ==={Style.RESET_ALL}")
        print("1. 添加新网站")
        print("2. 编辑现有网站")
        print("3. 删除网站")
        print("4. 查看所有网站")
        print("5. 测试网站配置")
        print("6. 系统设置")
        print("7. 退出")
        print()
        
    def load_sites_config(self):
        """加载网站配置"""
        try:
            if self.sites_config_file.exists():
                with open(self.sites_config_file, 'r', encoding='utf-8') as f:
                    return yaml.safe_load(f) or {}
            return {}
        except Exception as e:
            print(f"{Fore.RED}加载配置失败: {e}{Style.RESET_ALL}")
            return {}
            
    def save_sites_config(self, config):
        """保存网站配置"""
        try:
            self.config_dir.mkdir(exist_ok=True)
            with open(self.sites_config_file, 'w', encoding='utf-8') as f:
                yaml.dump(config, f, default_flow_style=False, allow_unicode=True)
            return True
        except Exception as e:
            print(f"{Fore.RED}保存配置失败: {e}{Style.RESET_ALL}")
            return False
            
    def add_site(self):
        """添加新网站"""
        print(f"{Fore.GREEN}=== 添加新网站 ==={Style.RESET_ALL}")
        
        # 基本信息
        site_id = input("网站ID（英文，用于标识）: ").strip()
        if not site_id:
            print(f"{Fore.RED}网站ID不能为空{Style.RESET_ALL}")
            return
            
        sites_config = self.load_sites_config()
        if site_id in sites_config:
            print(f"{Fore.RED}网站ID已存在{Style.RESET_ALL}")
            return
            
        site_name = input("网站名称: ").strip()
        site_url = input("网站URL: ").strip()
        
        if not site_name or not site_url:
            print(f"{Fore.RED}网站名称和URL不能为空{Style.RESET_ALL}")
            return
            
        # 登录配置
        print(f"\n{Fore.YELLOW}=== 登录配置 ==={Style.RESET_ALL}")
        login_required = input("是否需要登录？(y/n): ").lower().startswith('y')
        
        login_config = {}
        if login_required:
            login_config = {
                'login_url': input("登录页面URL（留空使用主URL）: ").strip() or site_url,
                'username_selector': input("用户名输入框选择器: ").strip(),
                'password_selector': input("密码输入框选择器: ").strip(),
                'submit_selector': input("登录按钮选择器（可选）: ").strip(),
                'wait_after_login': int(input("登录后等待时间（秒，默认3）: ") or "3")
            }
            
        # 内容选择器
        print(f"\n{Fore.YELLOW}=== 内容选择器配置 ==={Style.RESET_ALL}")
        print("提示：使用浏览器开发者工具（F12）获取CSS选择器")
        
        content_selectors = {
            'title': input("标题选择器: ").strip(),
            'content': input("内容选择器: ").strip(),
            'link': input("链接选择器（可选）: ").strip(),
            'date': input("日期选择器（可选）: ").strip()
        }
        
        # 高级配置
        print(f"\n{Fore.YELLOW}=== 高级配置 ==={Style.RESET_ALL}")
        scroll_to_load = input("是否需要滚动加载更多内容？(y/n): ").lower().startswith('y')
        max_scroll_times = 3
        if scroll_to_load:
            max_scroll_times = int(input("最大滚动次数（默认3）: ") or "3")
            
        extract_detail = input("是否进入详情页抓取完整内容？(y/n): ").lower().startswith('y')
        max_detail_pages = 5
        if extract_detail:
            max_detail_pages = int(input("最大详情页数量（默认5）: ") or "5")
            
        enabled = input("是否启用此网站？(y/n): ").lower().startswith('y')
        
        # 构建配置
        site_config = {
            'name': site_name,
            'url': site_url,
            'enabled': enabled,
            'login_required': login_required,
            'content_selectors': content_selectors,
            'scroll_to_load': scroll_to_load,
            'max_scroll_times': max_scroll_times,
            'extract_detail': extract_detail,
            'max_detail_pages': max_detail_pages
        }
        
        if login_required:
            site_config.update(login_config)
            
        # 保存配置
        sites_config[site_id] = site_config
        
        if self.save_sites_config(sites_config):
            print(f"{Fore.GREEN}网站配置已保存{Style.RESET_ALL}")
        else:
            print(f"{Fore.RED}保存失败{Style.RESET_ALL}")
            
    def list_sites(self):
        """列出所有网站"""
        sites_config = self.load_sites_config()
        
        if not sites_config:
            print(f"{Fore.YELLOW}没有配置任何网站{Style.RESET_ALL}")
            return
            
        print(f"{Fore.CYAN}=== 已配置的网站 ==={Style.RESET_ALL}")
        for site_id, config in sites_config.items():
            status = f"{Fore.GREEN}启用" if config.get('enabled', False) else f"{Fore.RED}禁用"
            login = "需要登录" if config.get('login_required', False) else "无需登录"
            print(f"{site_id}: {config.get('name', '未命名')} - {status}{Style.RESET_ALL} - {login}")
            print(f"  URL: {config.get('url', '')}")
            print()
            
    def edit_site(self):
        """编辑网站配置"""
        sites_config = self.load_sites_config()
        
        if not sites_config:
            print(f"{Fore.YELLOW}没有配置任何网站{Style.RESET_ALL}")
            return
            
        print(f"{Fore.CYAN}=== 编辑网站配置 ==={Style.RESET_ALL}")
        self.list_sites()
        
        site_id = input("请输入要编辑的网站ID: ").strip()
        if site_id not in sites_config:
            print(f"{Fore.RED}网站ID不存在{Style.RESET_ALL}")
            return
            
        config = sites_config[site_id]
        print(f"\n当前配置: {config.get('name', '未命名')}")
        
        # 简单的编辑选项
        print("\n可编辑的选项:")
        print("1. 启用/禁用")
        print("2. 修改URL")
        print("3. 修改内容选择器")
        print("4. 返回")
        
        choice = input("请选择: ").strip()
        
        if choice == '1':
            enabled = input(f"是否启用（当前: {config.get('enabled', False)}）？(y/n): ").lower().startswith('y')
            config['enabled'] = enabled
        elif choice == '2':
            new_url = input(f"新URL（当前: {config.get('url', '')}）: ").strip()
            if new_url:
                config['url'] = new_url
        elif choice == '3':
            print("修改内容选择器:")
            selectors = config.get('content_selectors', {})
            for key in ['title', 'content', 'link', 'date']:
                current = selectors.get(key, '')
                new_value = input(f"{key}选择器（当前: {current}）: ").strip()
                if new_value:
                    selectors[key] = new_value
            config['content_selectors'] = selectors
        elif choice == '4':
            return
        else:
            print(f"{Fore.RED}无效选择{Style.RESET_ALL}")
            return
            
        if self.save_sites_config(sites_config):
            print(f"{Fore.GREEN}配置已更新{Style.RESET_ALL}")
        else:
            print(f"{Fore.RED}保存失败{Style.RESET_ALL}")
            
    def delete_site(self):
        """删除网站配置"""
        sites_config = self.load_sites_config()
        
        if not sites_config:
            print(f"{Fore.YELLOW}没有配置任何网站{Style.RESET_ALL}")
            return
            
        print(f"{Fore.CYAN}=== 删除网站配置 ==={Style.RESET_ALL}")
        self.list_sites()
        
        site_id = input("请输入要删除的网站ID: ").strip()
        if site_id not in sites_config:
            print(f"{Fore.RED}网站ID不存在{Style.RESET_ALL}")
            return
            
        confirm = input(f"确认删除 {sites_config[site_id].get('name', site_id)}？(y/n): ")
        if confirm.lower().startswith('y'):
            del sites_config[site_id]
            if self.save_sites_config(sites_config):
                print(f"{Fore.GREEN}网站配置已删除{Style.RESET_ALL}")
            else:
                print(f"{Fore.RED}删除失败{Style.RESET_ALL}")
        else:
            print("取消删除")
            
    def test_site(self):
        """测试网站配置"""
        sites_config = self.load_sites_config()
        
        if not sites_config:
            print(f"{Fore.YELLOW}没有配置任何网站{Style.RESET_ALL}")
            return
            
        print(f"{Fore.CYAN}=== 测试网站配置 ==={Style.RESET_ALL}")
        self.list_sites()
        
        site_id = input("请输入要测试的网站ID: ").strip()
        if site_id not in sites_config:
            print(f"{Fore.RED}网站ID不存在{Style.RESET_ALL}")
            return
            
        print(f"{Fore.YELLOW}正在测试配置...{Style.RESET_ALL}")
        
        try:
            from src.collector import WebCollector
            collector = WebCollector()
            result = collector.test_site_config(sites_config[site_id])
            
            if result['success']:
                print(f"{Fore.GREEN}✓ 测试成功{Style.RESET_ALL}")
                print(f"收集到 {result['content_count']} 条内容")
                
                if result['sample_content']:
                    print("\n样本内容:")
                    for i, item in enumerate(result['sample_content'][:2], 1):
                        print(f"{i}. {item.get('title', '无标题')}")
                        if item.get('content'):
                            content = item['content'][:100] + '...' if len(item['content']) > 100 else item['content']
                            print(f"   内容: {content}")
                        print()
            else:
                print(f"{Fore.RED}✗ 测试失败{Style.RESET_ALL}")
                print(f"错误: {result['error']}")
                
        except ImportError:
            print(f"{Fore.RED}请先安装依赖包: pip install -r requirements.txt{Style.RESET_ALL}")
        except Exception as e:
            print(f"{Fore.RED}测试失败: {e}{Style.RESET_ALL}")
            
    def system_settings(self):
        """系统设置"""
        print(f"{Fore.CYAN}=== 系统设置 ==={Style.RESET_ALL}")
        print("1. 定时任务设置")
        print("2. 浏览器设置")
        print("3. 存储设置")
        print("4. 返回")
        
        choice = input("请选择: ").strip()
        
        if choice == '1':
            self._schedule_settings()
        elif choice == '2':
            self._browser_settings()
        elif choice == '3':
            self._storage_settings()
        elif choice == '4':
            return
        else:
            print(f"{Fore.RED}无效选择{Style.RESET_ALL}")
            
    def _schedule_settings(self):
        """定时任务设置"""
        print(f"{Fore.YELLOW}=== 定时任务设置 ==={Style.RESET_ALL}")
        print("常用设置:")
        print("1. 每小时执行")
        print("2. 每2小时执行")
        print("3. 每天指定时间执行")
        print("4. 自定义")
        
        choice = input("请选择: ").strip()
        
        schedule_config = {}
        
        if choice == '1':
            schedule_config = {'hour': '*', 'minute': '0', 'second': '0'}
        elif choice == '2':
            schedule_config = {'hour': '*/2', 'minute': '0', 'second': '0'}
        elif choice == '3':
            times = input("请输入执行时间（如: 9,12,15,18）: ").strip()
            schedule_config = {'hour': times, 'minute': '0', 'second': '0'}
        elif choice == '4':
            schedule_config = {
                'hour': input("小时（如: */2, 9,12,15,18, *）: ").strip(),
                'minute': input("分钟（如: 0, */30）: ").strip(),
                'second': input("秒（通常为0）: ").strip() or '0'
            }
        else:
            print(f"{Fore.RED}无效选择{Style.RESET_ALL}")
            return
            
        # 保存配置
        try:
            if self.system_config_file.exists():
                with open(self.system_config_file, 'r', encoding='utf-8') as f:
                    system_config = yaml.safe_load(f) or {}
            else:
                system_config = {}
                
            system_config['schedule'] = schedule_config
            
            with open(self.system_config_file, 'w', encoding='utf-8') as f:
                yaml.dump(system_config, f, default_flow_style=False, allow_unicode=True)
                
            print(f"{Fore.GREEN}定时任务配置已保存{Style.RESET_ALL}")
            
        except Exception as e:
            print(f"{Fore.RED}保存失败: {e}{Style.RESET_ALL}")
            
    def _browser_settings(self):
        """浏览器设置"""
        print(f"{Fore.YELLOW}=== 浏览器设置 ==={Style.RESET_ALL}")
        
        headless = input("是否启用无头模式（后台运行）？(y/n): ").lower().startswith('y')
        timeout = int(input("页面加载超时时间（秒，默认30）: ") or "30")
        
        browser_config = {
            'headless': headless,
            'window_size': [1920, 1080],
            'timeout': timeout,
            'implicit_wait': 10
        }
        
        # 保存配置
        try:
            if self.system_config_file.exists():
                with open(self.system_config_file, 'r', encoding='utf-8') as f:
                    system_config = yaml.safe_load(f) or {}
            else:
                system_config = {}
                
            system_config['browser'] = browser_config
            
            with open(self.system_config_file, 'w', encoding='utf-8') as f:
                yaml.dump(system_config, f, default_flow_style=False, allow_unicode=True)
                
            print(f"{Fore.GREEN}浏览器配置已保存{Style.RESET_ALL}")
            
        except Exception as e:
            print(f"{Fore.RED}保存失败: {e}{Style.RESET_ALL}")
            
    def _storage_settings(self):
        """存储设置"""
        print(f"{Fore.YELLOW}=== 存储设置 ==={Style.RESET_ALL}")
        
        data_dir = input("数据存储目录（默认data）: ").strip() or "data"
        cleanup_days = int(input("自动清理天数（默认30）: ") or "30")
        
        storage_config = {
            'data_dir': data_dir,
            'max_items_per_site': 1000,
            'cleanup_days': cleanup_days
        }
        
        # 保存配置
        try:
            if self.system_config_file.exists():
                with open(self.system_config_file, 'r', encoding='utf-8') as f:
                    system_config = yaml.safe_load(f) or {}
            else:
                system_config = {}
                
            system_config['storage'] = storage_config
            
            with open(self.system_config_file, 'w', encoding='utf-8') as f:
                yaml.dump(system_config, f, default_flow_style=False, allow_unicode=True)
                
            print(f"{Fore.GREEN}存储配置已保存{Style.RESET_ALL}")
            
        except Exception as e:
            print(f"{Fore.RED}保存失败: {e}{Style.RESET_ALL}")
            
    def run(self):
        """运行配置工具"""
        while True:
            self.show_menu()
            choice = input("请选择操作: ").strip()
            
            if choice == '1':
                self.add_site()
            elif choice == '2':
                self.edit_site()
            elif choice == '3':
                self.delete_site()
            elif choice == '4':
                self.list_sites()
            elif choice == '5':
                self.test_site()
            elif choice == '6':
                self.system_settings()
            elif choice == '7':
                print(f"{Fore.GREEN}再见！{Style.RESET_ALL}")
                break
            else:
                print(f"{Fore.RED}无效选择，请重新输入{Style.RESET_ALL}")
                
            input("\n按回车键继续...")
            print("\n" + "="*50 + "\n")
            
def main():
    """主函数"""
    tool = ConfigTool()
    tool.run()
    
if __name__ == "__main__":
    main()